package com.domi.config;

import feign.Logger;
import feign.Retryer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.TimeUnit;

// 配置项可以参考：@see feign.Feign.Builder
// https://docs.spring.io/spring-cloud-openfeign/docs/3.1.4/reference/html/#feign-capability-support
@Configuration
public class FeignConfiguration {

    // 日志, 默认只对debug级别起效
    @Bean
    public Logger.Level feignLoggerLevel() {
        // 默认为NONE, 不记录日志
        // FULL记录完整的日志信息
        return Logger.Level.FULL;
    }

    // 自定义日志对象, 默认用的是Slf4jLogger, Slf4jLogger是用debug打印日志的
    @Bean
    public Logger feignLogger() {
        return new MyFeignLogger();
    }

    // 重试机制
    @Bean
    public Retryer feignRetryer() {
        // 默认最大请求次数为5, 初始间隔时间为100ms, 下次间隔时间1.5倍递增, 重试间最大间隔时间为1s
        // return new Retryer.Default();
        return new Retryer.Default(100, TimeUnit.SECONDS.toMillis(1), 2);
    }

    // 错误码译码器
//    @Bean
//    public ErrorDecoder feignErrorDecoder() {
//        return (methodKey, response) -> {
//            int status = response.status();
//            Map<String, Object> errorMap = new HashMap<>();
//            errorMap.put("errmesg", "The request failed");
//            errorMap.put("errcode", status);
//            System.err.println("===>> [methodKey]: " + methodKey);
//            response.
//        };
//    }

    @Slf4j
    static class MyFeignLogger extends Logger {

        @Override
        protected void log(String configKey, String format, Object... args) {
            // info 级别
            log.info(String.format(methodTag(configKey) + format, args));
        }

    }

}